#ifndef DockManagerH
#define DockManagerH
/*******************************************************************************
** Qt Advanced Docking System
** Copyright (C) 2017 Uwe Kindler
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/


//============================================================================
/// \file   DockManager.h
/// \author Uwe Kindler
/// \date   26.02.2017
/// \brief  Declaration of CDockManager class
//============================================================================


//============================================================================
//                                   INCLUDES
//============================================================================
#include "ads_globals.h"
#include "DockContainerWidget.h"
#include "DockWidget.h"
#include "FloatingDockContainer.h"


QT_FORWARD_DECLARE_CLASS(QSettings)
QT_FORWARD_DECLARE_CLASS(QMenu)

namespace ads {
struct DockManagerPrivate;
    class CFloatingDockContainer;
    struct FloatingDockContainerPrivate;
    class CDockContainerWidget;
    class DockContainerWidgetPrivate;
    class CDockOverlay;
    class CDockAreaTabBar;
    class CDockWidgetTab;
    struct DockWidgetTabPrivate;
    struct DockAreaWidgetPrivate;
    class CIconProvider;
    class CDockComponentsFactory;
    class CDockFocusController;
    class CAutoHideSideBar;
    class CAutoHideTab;
    struct AutoHideTabPrivate;
    
    /**
     * 中央停靠管理器，负责维护完整的停靠系统。
     * 使用配置标志可以全局控制停靠系统的功能。
     * 停靠管理器使用内部样式表来为其组件（如分隔条、选项卡和按钮）设置样式。
     * 如果您想禁用此样式表，因为您的应用程序使用自己的样式表，只需调用设置样式表的函数并传入空字符串即可。
     * \code
     * DockManager->setStyleSheet("");
     * \endcode
     **/
    class ADS_EXPORT CDockManager : public CDockContainerWidget {
        Q_OBJECT
    private:
        DockManagerPrivate* d; ///< 私有数据 (pimpl)
        friend struct DockManagerPrivate;
        friend class CFloatingDockContainer;
        friend struct FloatingDockContainerPrivate;
        friend class CDockContainerWidget;
        friend class DockContainerWidgetPrivate;
        friend class CDockAreaTabBar;
        friend class CDockWidgetTab;
        friend struct DockAreaWidgetPrivate;
        friend struct DockWidgetTabPrivate;
        friend class CFloatingDragPreview;
        friend struct FloatingDragPreviewPrivate;
        friend class CDockAreaTitleBar;
        friend class CAutoHideDockContainer;
        friend CAutoHideSideBar;
        friend CAutoHideTab;
        friend AutoHideTabPrivate;
    public Q_SLOTS:
        /**
         * 结束恢复最小化状态的过程
         */
        void endLeavingMinimizedState();
    protected:
        /**
         * 在内部列表中注册给定的浮动窗口小部件
         */
        void registerFloatingWidget(CFloatingDockContainer* FloatingWidget);
        /**
         * 从已注册的浮动窗口小部件列表中移除给定的浮动窗口小部件
         */
        void removeFloatingWidget(CFloatingDockContainer* FloatingWidget);
        /**
         * 注册给定的停靠容器小部件
         */
        void registerDockContainer(CDockContainerWidget* DockContainer);
        /**
         * 从内部已注册的停靠容器列表中移除停靠容器
         */
        void removeDockContainer(CDockContainerWidget* DockContainer);
        /**
         * 容器调用此函数，如果一个小部件被拖放到其中
         */
        void notifyWidgetOrAreaRelocation(QWidget* RelocatedWidget);
        /**
         * 如果一个浮动窗口小部件被拖放到新位置，则调用此函数。
         * 当调用此函数时，FloatingWidget的所有停靠小部件已经插入到新位置
         */
        void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget);
        /**
         * 显示已创建的浮动窗口小部件
         */
        virtual void showEvent(QShowEvent *event) override;
        /**
         * 访问内部停靠焦点控制器。
         * 只有在设置了FocusHighlighting标志时，此函数才返回有效对象。
         */
        CDockFocusController* dockFocusController() const;
        /**
         * 恢复先前通过hideManagerAndFloatingWidgets()隐藏的浮动窗口小部件
         */
        void restoreHiddenFloatingWidgets();

public:
	using Super = CDockContainerWidget;

	enum eViewMenuInsertionOrder
	{
		MenuSortedByInsertion,
		MenuAlphabeticallySorted
	};

	/**
 * 这些全局配置标志用于配置一些全局的停靠管理器设置。
 * 在创建停靠管理器实例之前，设置停靠管理器的标志。
 */
enum eConfigFlag
{
    ActiveTabHasCloseButton = 0x0001,    //!< 如果设置了此标志，则选项卡区域中的活动选项卡有一个关闭按钮
    DockAreaHasCloseButton = 0x0002,     //!< 如果设置了此标志，则每个停靠区域都有一个关闭按钮
    DockAreaCloseButtonClosesTab = 0x0004,//!< 如果设置了此标志，则停靠区域的关闭按钮关闭活动选项卡，如果未设置，则关闭整个停靠区域
    OpaqueSplitterResize = 0x0008, //!< 参见 QSplitter::setOpaqueResize() 文档
    XmlAutoFormattingEnabled = 0x0010,//!< 如果启用，XML writer 会自动在元素之间的空白区域添加换行符和缩进（可忽略的空白字符）
    XmlCompressionEnabled = 0x0020,//!< 如果启用，XML 输出将被压缩，不再是可读的人类格式
    TabCloseButtonIsToolButton = 0x0040,//!< 如果启用，选项卡的关闭按钮将是 QToolButton，而不是 QPushButton - 默认禁用
    AllTabsHaveCloseButton = 0x0080, //!< 如果设置了此标志，则所有可关闭的选项卡都显示一个关闭按钮
    RetainTabSizeWhenCloseButtonHidden = 0x0100, //!< 如果设置了此标志，则即使关闭按钮不可见，也会保留关闭按钮的空间
    DragPreviewIsDynamic = 0x0400,///< 如果禁用了不透明的拖动，此标志定义拖动预览窗口的行为，如果启用此标志，预览将根据放置区域动态调整
    DragPreviewShowsContentPixmap = 0x0800,///< 如果禁用了不透明的拖动，创建的拖动预览窗口会显示拖动的停靠窗口/停靠区域的内容的副本
    DragPreviewHasWindowFrame = 0x1000,///< 如果禁用了不透明的拖动，则此标志配置拖动预览是否无框架或者看起来像一个真实的窗口
    AlwaysShowTabs = 0x2000,///< 如果启用此选项，停靠窗口的选项卡始终显示 - 即使它是浮动窗口中唯一可见的停靠窗口
    DockAreaHasUndockButton = 0x4000,     //!< 如果设置了此标志，则每个停靠区域都有一个解除停靠按钮
    DockAreaHasTabsMenuButton = 0x8000,     //!< 如果设置了此标志，则每个停靠区域都有一个选项卡菜单按钮
    DockAreaHideDisabledButtons = 0x10000,    //!< 如果设置了此标志，则禁用的停靠区域按钮将不会出现在工具栏上（启用它们将使它们重新出现）
    DockAreaDynamicTabsMenuButtonVisibility = 0x20000, //!< 如果设置了此标志，则只有在需要时才会显示选项卡菜单按钮 - 这意味着如果选项卡被省略，则显示它。如果选项卡没有被省略，则隐藏它
    FloatingContainerHasWidgetTitle = 0x40000, //!< 如果设置了此标志，则浮动窗口小部件的窗口标题反映当前停靠窗口的标题，否则显示使用 `CDockManager::setFloatingContainersTitle` 设置的标题或应用程序名称作为窗口标题
    FloatingContainerHasWidgetIcon = 0x80000, //!< 如果设置了此标志，则浮动窗口小部件的图标反映当前停靠窗口的图标，否则显示应用程序图标
    HideSingleCentralWidgetTitleBar = 0x100000, //!< 如果主停靠容器（停靠管理器）中只有一个可见的停靠窗口小部件，并且设置了此标志，则隐藏此停靠窗口小部件的标题栏
                                                //!< 这仅对于不可拖动和不可浮动的小部件有意义，并且可以创建一种“中央”小部件
    FocusHighlighting = 0x200000, //!< 启用对焦的停靠窗口选项卡或浮动窗口标题栏的样式化
    EqualSplitOnInsertion = 0x400000, ///!< 如果启用，空间将均匀分布到分隔器中的所有小部件
    FloatingContainerForceNativeTitleBar = 0x800000, //!< 仅适用于 Linux！强制所有浮动窗口小部件使用本机标题栏。这可能会破坏某些窗口管理器上的浮动窗口小部件的停靠（如 Kwin/KDE）。
                                                     //!< 如果未设置此标志或 FloatingContainerForceCustomTitleBar，将使用本机标题栏，除非在已知的不良系统上。
                                                     //! 用户可以通过将环境变量 ADS_UseNativeTitle 设置为 "1" 或 "0" 来重写此设置。
    FloatingContainerForceQWidgetTitleBar = 0x1000000,//!< 仅适用于 Linux！强制所有浮动窗口小部件使用基于 QWidget 的标题栏。
                                                     //!< 如果未设置此标志或 FloatingContainerForceNativeTitleBar（默认值），将使用本机标题栏，除非在已知的不良系统上。
                                                     //! 用户可以通过将环境变量 ADS_UseNativeTitle 设置为 "1" 或 "0" 来重写此设置。
    MiddleMouseButtonClosesTab = 0x2000000, //! 如果设置了此标志，用户可以使用鼠标中键关闭鼠标下的选项卡
    DefaultDockAreaButtons = DockAreaHasCloseButton
                             | DockAreaHasUndockButton
                             | DockAreaHasTabsMenuButton, ///< 停靠区域标题栏按钮的默认配置
    DefaultBaseConfig = DefaultDockAreaButtons
                        | ActiveTabHasCloseButton
                        | XmlCompressionEnabled
                        | FloatingContainerHasWidgetTitle, ///< 默认基础配置设置
    DefaultOpaqueConfig = DefaultBaseConfig
                          | OpaqueSplitterResize
                          | DragPreviewShowsContentPixmap, ///< 非透明操作的默认配置
    DefaultNonOpaqueConfig = DefaultBaseConfig
                             | DragPreviewShowsContentPixmap, ///< 非透明操作的默认配置
    NonOpaqueWithWindowFrame = DefaultNonOpaqueConfig
                              | DragPreviewHasWindowFrame ///< 非透明操作的默认配置，显示带有边框的真实窗口
};
Q_DECLARE_FLAGS(ConfigFlags, eConfigFlag)
/**
 * 这些全局配置标志配置了一些停靠管理器自动隐藏的设置
 * 在创建停靠管理器实例之前，设置停靠管理器的标志。
 */
enum eAutoHideFlag
{
    AutoHideFeatureEnabled = 0x01, //!< 启用/禁用自动隐藏功能
    DockAreaHasAutoHideButton = 0x02,     //!< 如果设置了此标志，则每个停靠区域都有一个自动隐藏菜单按钮
    AutoHideButtonTogglesArea = 0x04, //!< 如果设置了此标志，则自动隐藏按钮会为区域中的所有停靠窗口启用自动隐藏，如果禁用，则仅切换当前停靠窗口
    AutoHideButtonCheckable = 0x08, //!< 如果设置了此标志，则自动隐藏按钮将根据自动隐藏状态进行选中和取消选中。主要用于样式设置。
    AutoHideSideBarsIconOnly = 0x10,///< 在自动隐藏的侧边栏选项卡中只显示图标 - 如果选项卡没有图标，则显示文本
    AutoHideShowOnMouseOver = 0x20, ///< 在选项卡上鼠标悬停时显示自动隐藏窗口，并在鼠标离开自动隐藏容器时隐藏它
    AutoHideCloseButtonCollapsesDock = 0x40, ///< 自动隐藏容器的关闭按钮会折叠停靠而不是完全隐藏它
    DefaultAutoHideConfig = AutoHideFeatureEnabled
                            | DockAreaHasAutoHideButton
                            | AutoHideCloseButtonCollapsesDock
};
Q_DECLARE_FLAGS(AutoHideFlags, eAutoHideFlag)

/**
 * 默认构造函数。
 * 如果给定的父窗口是 QMainWindow，则停靠管理器会将自身设置为中央窗口部件。
 * 在创建任何停靠窗口小部件之前，您应该通过 setConfigFlags() 适当设置配置标志。
 */
CDockManager(QWidget* parent = nullptr);
/**
 * 虚析构函数
 */
virtual ~CDockManager() override;
/**
 * 此函数返回全局配置标志
 */
static ConfigFlags configFlags();
/**
 * 此函数返回自动隐藏配置标志
 */
static AutoHideFlags autoHideConfigFlags();
/**
 * 设置整个停靠系统的全局配置标志。
 * 在创建停靠管理器和创建第一个停靠窗口小部件之前调用此函数。
 */
static void setConfigFlags(const ConfigFlags Flags);
/**
 * 设置整个停靠系统的全局配置标志。
 * 在创建停靠管理器和创建第一个停靠窗口小部件之前调用此函数。
 */
static void setAutoHideConfigFlags(const AutoHideFlags Flags);
/**
 * 设置特定的配置标志。
 * \see setConfigFlags()
 */
static void setConfigFlag(eConfigFlag Flag, bool On = true);
/**
 * 设置特定的自动隐藏配置标志。
 * \see setConfigFlags()
 */
static void setAutoHideConfigFlag(eAutoHideFlag Flag, bool On = true);
/**
 * 如果设置了给定的配置标志，则返回 true
 */
static bool testConfigFlag(eConfigFlag Flag);
/**
 * 如果设置了给定的自动隐藏配置标志，则返回 true
 */
static bool testAutoHideConfigFlag(eAutoHideFlag Flag);
/**
 * 返回全局图标提供者。
 * 图标提供者允许在不能使用样式表进行图标设置的情况下使用自定义图标。
 */
static CIconProvider& iconProvider();

	/**
 * 将dockwidget添加到给定的区域。
 * 如果DockAreaWidget不为空，则area参数表示在DockAreaWidget中的区域。
 * 如果DockAreaWidget为空，则Dockwidget将被放置在容器中。
 * 如果要将dock widget添加为选项卡，则需要将其添加到现有的dock area对象中的CenterDockWidgetArea。
 * 下面的代码显示了这个过程：
 * \code
 * DockManager->addDockWidget(ads::CenterDockWidgetArea, NewDockWidget, ExistingDockArea);
 * \endcode
 * \return 返回包含新DockWidget的dock area widget
 */
CDockAreaWidget* addDockWidget(DockWidgetArea area, CDockWidget* Dockwidget, CDockAreaWidget* DockAreaWidget = nullptr, int Index = -1);

/**
 * 将dockwidget添加到给定的容器。
 * 这允许您将dock widget放置在一个容器中，即使该容器尚未包含DockAreaWidget。
 * \return 返回包含新DockWidget的dock area widget
 */
CDockAreaWidget* addDockWidgetToContainer(DockWidgetArea area, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget);

/**
 * 将Auto-Hide widget添加到dock manager容器中，固定在指定的侧边栏位置。
 * \return 返回包含新DockWidget的CAutoHideDockContainer
 */
CAutoHideDockContainer* addAutoHideDockWidget(SideBarLocation Location, CDockWidget* Dockwidget);

/**
 * 将Auto-Hide widget添加到给定的DockContainerWidget中，固定在该容器中的指定侧边栏位置。
 * \return 返回包含新DockWidget的CAutoHideDockContainer
 */
CAutoHideDockContainer* addAutoHideDockWidgetToContainer(SideBarLocation Location, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget);

/**
 * 将给定的Dockwidget作为新选项卡添加到给定的dock area中。
 * 如果给定区域标识符没有对应的dock area widget，则创建一个新的dock area widget。
 */
CDockAreaWidget* addDockWidgetTab(DockWidgetArea area, CDockWidget* Dockwidget);

/**
 * 将给定的Dockwidget作为新选项卡添加到给定的DockAreaWidget中。
 * 如果index超出范围，则将选项卡简单地追加到末尾。否则，将在指定位置插入。
 */
CDockAreaWidget* addDockWidgetTabToArea(CDockWidget* Dockwidget, CDockAreaWidget* DockAreaWidget, int Index = -1);

/**
 * 添加给定的DockWidget并创建CFloatingDockContainer实例，使其浮动。
 */
CFloatingDockContainer* addDockWidgetFloating(CDockWidget* Dockwidget);

/**
 * 使用给定的ObjectName搜索已注册的dock widget。
 * \return 如果未注册具有给定名称的dock widget，则返回找到的dock widget；否则返回nullptr。
 */
CDockWidget* findDockWidget(const QString& ObjectName) const;

/**
 * 从dock manager中移除给定的Dock。
 */
void removeDockWidget(CDockWidget* Dockwidget);

/**
 * 返回内部dock widgets映射的可读引用，以便可以遍历所有dock widgets。
 */
QMap<QString, CDockWidget*> dockWidgetsMap() const;

/**
 * 返回所有活动和可见的dock containers的列表。
 * dock containers包括主dock manager和所有浮动窗口。
 */
const QList<CDockContainerWidget*> dockContainers() const;

/**
 * 返回所有浮动窗口的列表。
 */
const QList<CFloatingDockContainer*> floatingWidgets() const;

/**
 * 该函数始终返回0，因为主窗口始终在任何浮动窗口后面。
 */
unsigned int zOrderIndex() const override;

/**
 * 将dockmanager及其dock widgets的当前状态保存到返回的QByteArray中。
 * XmlMode参数用于启用/禁用XmlStreamWriter的自动格式化。
 * 如果启用了自动格式化，则输出将进行缩进和换行。
 * 如果希望获得更紧凑的XML输出（例如用于存储在ini文件中），则可以禁用自动格式化。
 * 版本号作为数据的一部分存储。
 * 要恢复保存的状态，请将返回值和版本号传递给restoreState()函数。
 * \see restoreState()
 */
QByteArray saveState(int version = 0) const;

/**
 * 恢复此dockmanager的dockwidgets状态。
 * 将版本号与state中存储的版本号进行比较。
 * 如果它们不匹配，则dockmanager的状态保持不变，并且此函数返回false；
 * 否则，恢复状态并返回true。
 * \see saveState()
 */
bool restoreState(const QByteArray &state, int version = 0);

/**
 * 将当前状态保存为内部的perspectives列表中的一个透视图。
 * 透视图是dock manager的当前状态，并分配了一个特定的名称。
 * 这使用户可以快速切换不同的透视图。
 * 如果给定名称的透视图已经存在，则将使用新状态覆盖它。
 */
void addPerspective(const QString& UniquePrespectiveName);

/**
 * 从透视图列表中删除具有给定名称的透视图。
 */
void removePerspective(const QString& Name);

	// 移除给定的视角
void removePerspectives(const QStringList& Names);

// 返回所有可用视角的名称
QStringList perspectiveNames() const;

// 将视角保存到给定的设置文件中
void savePerspectives(QSettings& Settings) const;

// 从给定的设置文件中加载视角
void loadPerspectives(QSettings& Settings);

// 返回管理器的中央窗口部件，如果没有设置中央窗口部件则返回nullptr
CDockWidget* centralWidget() const;

// 将dockwidget部件添加到中央区域并将其标记为中央窗口部件
// 如果已经设置了中央窗口部件，则只有该窗口部件会随着dock容器调整大小
// 中央窗口部件不能移动、浮动或关闭，中央dock区域的标题栏不可见
// 如果给定的部件可以设置为中央窗口部件，则函数返回创建的dock区域
// 如果给定的部件不能设置为中央窗口部件，因为已经存在中央窗口部件，则函数返回nullptr
// 若要清除中央窗口部件，请将nullptr传递给函数
// 注意：只有在添加其他dock部件之前才能设置中央窗口部件
// 返回值：
// != 0：包含中央窗口部件的dock区域
// nullptr：表示给定的部件不能设置为中央窗口部件，因为已经存在中央窗口部件
CDockAreaWidget* setCentralWidget(CDockWidget* widget);

// 将切换视图操作添加到内部视图菜单中
// 可以在应用程序中管理切换视图操作的插入，也可以将操作添加到内部视图菜单中，
// 然后将菜单对象插入到自己的菜单中
// 参数：
// ToggleViewAction：要插入的操作，如果未提供组，则直接插入到菜单中
// Group：用于组菜单项的文本
// GroupIcon：用于对工作区进行分组的图标，例如，对于每个设备的工作区，可以将所有这些工作区分组到一个菜单项下
// 返回值：
// 如果Group不为空，则返回此组的GroupAction；如果组为空，则返回给定的ToggleViewAction
QAction* addToggleViewActionToMenu(QAction* ToggleViewAction, const QString& Group = QString(), const QIcon& GroupIcon = QIcon());

// 返回内部视图菜单
// 可以使用addToggleViewActionToMenu()函数来填充视图菜单
QMenu* viewMenu() const;

// 定义切换视图菜单项的插入顺序
// 顺序定义了操作如何添加到视图菜单中
// 默认的插入顺序是MenuAlphabeticallySorted，以便用户更容易找到特定dock部件的菜单项
// 在插入第一个菜单项之前，需要调用此函数
void setViewMenuInsertionOrder(eViewMenuInsertionOrder Order);

// 在发出restoringState()和stateRestored()信号之间返回true
bool isRestoringState() const;

// 如果DockManager窗口正在从最小化状态恢复，则返回true
// 从QWindowStateChangeEvent开始，信号将从最小化状态变为正常状态，直到调用endLeavingMinimizedState()函数为止
bool isLeavingMinimizedState() const;

// 在dock部件开始浮动之前，用户需要按住鼠标左键移动的距离
static int startDragDistance();

// 根据FocusStyling标志的配置设置焦点
template <class QWidgetPtr>
static void setWidgetFocus(QWidgetPtr widget)
{
	if (!CDockManager::testConfigFlag(CDockManager::FocusHighlighting))
	{
		return;
	}
	widget->setFocus(Qt::OtherFocusReason);
}

// 事件过滤器
bool eventFilter(QObject *obj, QEvent *e) override;

// 返回在ui中具有焦点样式的dock部件，如果没有dock部件具有焦点样式，则返回nullptr
// 如果禁用了FocusHighlighting标志，则此函数始终返回nullptr
CDockWidget* focusedDockWidget() const;

// 返回包含dock区域的分割器的大小
// 如果没有包含区域的分割器，则返回空列表
QList<int> splitterSizes(CDockAreaWidget *ContainedArea) const;

// 更新分割器的大小
// 通过调用QSplitter::setSizes()方法，以编程方式更新给定分割器的大小
// 分割器将是包含所提供的dock区域部件的分割器
// 如果没有包含dock区域的分割器，或者提供的大小与分割器的子项数不匹配，则此方法将不起作用
void setSplitterSizes(CDockAreaWidget *ContainedArea, const QList<int>& sizes);

// 设置所有浮动容器的自定义标题，该标题不反映当前dock部件的标题
static void setFloatingContainersTitle(const QString& Title);

	好的，以下是将英文注释改为中文的代码：
/**
 * 将给定的视角从停靠管理器中移除
 */
void removePerspectives(const QStringList& Names);

/**
 * 返回所有可用视角的名称
 */
QStringList perspectiveNames() const;

/**
 * 将视角保存到给定的设置文件中
 */
void savePerspectives(QSettings& Settings) const;

/**
 * 从给定的设置文件中加载视角
 */
void loadPerspectives(QSettings& Settings);

/**
 * 返回所有FloatingContainer使用的标题，该标题不反映当前dock部件的标题
 * 如果没有使用setFloatingContainersTitle()设置标题，则返回QGuiApplication::applicationDisplayName()
 */
static QString floatingContainersTitle();

public Q_SLOTS:
/**
 * 打开具有给定名称的视角
 */
void openPerspective(const QString& PerspectiveName);

/**
 * 请求将焦点切换到给定的dock部件
 * 仅当CDockManager::FocusStyling标志启用时，此函数才有效
 */
void setDockWidgetFocused(CDockWidget* DockWidget);

/**
 * 隐藏CDockManager和所有浮动窗口（参见Issue＃380）
 * 调用常规QWidget::hide()函数隐藏CDockManager，但不隐藏浮动窗口
 */
void hideManagerAndFloatingWidgets();

Q_SIGNALS:
/**
 * 当视角列表发生变化时，发出此信号
 * 视角列表在添加、删除视角或加载视角列表时发生变化
 */
void perspectiveListChanged();

/**
 * 当视角列表加载完成时，发出此信号
 */
void perspectiveListLoaded();

/**
 * 当视角被移除时，发出此信号
 */
void perspectivesRemoved();

/**
 * 在恢复状态之前，开始恢复状态时发出此信号
 * 如果调用了此函数，表示还没有进行任何更改
 */
void restoringState();

/**
 * 在restoreState函数中，状态发生更改时发出此信号
 * 当调用restoreState()函数或openPerspective()函数时，会发出此信号
 */
void stateRestored();

/**
 * 在dock管理器开始打开视角时发出此信号
 * 如果有许多复杂的部件，打开视角可能需要超过一秒钟的时间
 * 应用程序可以使用此信号显示一些进度指示器或将鼠标指针更改为忙碌状态
 */
void openingPerspective(const QString& PerspectiveName);

/**
 * 在dock管理器完成打开视角时发出此信号
 */
void perspectiveOpened(const QString& PerspectiveName);

/**
 * 在创建新的浮动窗口部件时发出此信号
 * 应用程序可以使用此信号来订阅新窗口的事件
 */
void floatingWidgetCreated(ads::CFloatingDockContainer* FloatingWidget);

/**
 * 在创建新的DockArea时发出此信号
 * 应用程序可以使用此信号为DockArea按钮设置自定义图标或自定义工具提示
 */
void dockAreaCreated(ads::CDockAreaWidget* DockArea);

/**
 * 在将dock部件添加到dock管理器实例时发出此信号
 */
void dockWidgetAdded(ads::CDockWidget* DockWidget);

/**
 * 在从dock管理器中移除给定的dock部件之前发出此信号
 */
void dockWidgetAboutToBeRemoved(ads::CDockWidget* DockWidget);

/**
 * 在使用removeDockWidget()函数从dock管理器中移除dock部件时发出此信号
 * 如果发出此信号，表示dock部件已从停靠系统中移除，但尚未删除
 */
void dockWidgetRemoved(ads::CDockWidget* DockWidget);

/**
 * 当焦点的dock部件发生更改时发出此信号
 * 旧部件和新部件都可以为nullptr
 * 焦点的dock部件是GUI中突出显示的部件
 */
void focusedDockWidgetChanged(ads::CDockWidget* old, ads::CDockWidget* now);
}; // class DockManager
} // namespace ads

Q_DECLARE_OPERATORS_FOR_FLAGS(ads::CDockManager::ConfigFlags)
//-----------------------------------------------------------------------------
#endif // DockManagerH
